package org.snail.transport.handler;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToByteEncoder;
import org.snail.transport.protocol.*;

/**
 * snail消息头16个字节定长
 *
 * ****************************************************************************************************
 *                                          protocol
 *  ┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐
 *       2   │   1   │    1   │     8     │      4      │
 *  ├ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┤
 *           │       │        │           │             │
 *  │  magic   sign    status   invokeId    body length                   body                       │
 *           │       │        │           │             │
 *  └ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┘
 *
 * ****************************************************************************************************
 * + 2    magic,(short) 0xabcd。
 * + 1    消息标志位低地址4位用来表示消息类型request/response/heartbeat, 高地址4位用来表示序列化类型。
 * + 1    状态位, 设置请求响应状态。
 * + 8    invokeId。
 * + 4    消息体 body 长度, int 类型。
 *
 * 编码
 *
 * Created by fish on 17/4/3.
 */
@ChannelHandler.Sharable
public class SnailEncoder extends MessageToByteEncoder<Object> {

    @Override
    protected void encode(ChannelHandlerContext channelHandlerContext, Object object, ByteBuf byteBuf) throws Exception {

        if(object instanceof Message){
            Message message = (Message) object;
            byteBuf.writeShort(Header.MAGIC)
                    .writeByte(message.getHeader().getSign())
                    .writeByte(message.getHeader().getStatusType())
                    .writeLong(message.getHeader().getInvokeId())
                    .writeInt(message.getBody().length)
                    .writeBytes(message.getBody());

        }

    }
}
